package com.example.user.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author 刘武贵
 * @Date 2024-03-13 21:11
 * @Description 功能描述：通过IOC容器获取Nacos配置+通过注解获取Nacos配置 热重启
 * 虽然通过IOC容器和注解都能够读取到Nacos中更新后的配置信息，但是在实际项目中，推荐使用注解的方式获取Nacos中更新后的配置信息。
 *
 * 1、单服务多环境实现共享
 * 实现单个微服务在多个不同环境中的配置共享比较简单，只要在Nacos中配置一个以spring.application.name为Data ID的配置文件，并且将这个微服务在所有环境中公共的配置放进去即可。
 *
 * 2、多服务配置实现共享
 * 不同的微服务之间实现公共的配置共享也比较简单，在Nacos中定义一个公共配置，然后在当前的配置中引入即可。
 *
 */
@Slf4j
@RefreshScope
@RestController
public class NacosController {

    /**
     * 注入Spring应用上下文
     */
    @Autowired
    private ConfigurableApplicationContext context;

    /**
     * 通过@Value注解从Nacos配置中心动态获取作者名字
     */
    @Value("${author.name}")
    private String nacosAuthorName;

    /**
     * 通过Spring应用上下文获取配置中心的作者名字
     * 无参数
     * 访问链接：http://localhost:10001/server-user/user/nacos/test
     * @return 返回从配置中心获取到的作者名字
     */
    @GetMapping("/nacos/test")
    public String nacosTest(){
        // 从应用上下文中获取环境变量，尝试读取author.name配置
        String authorName = context.getEnvironment().getProperty("author.name");
        log.info("获取到的作者姓名为：{}", authorName);
        return authorName;
    }

    /**
     * 直接通过注解方式获取Nacos配置中心的作者名字
     * 无参数
     * 访问链接：http://localhost:10001/server-user/user/nacos/name
     * @return 返回从Nacos配置中心获取到的作者名字
     */
    @GetMapping("/nacos/name")
    public String nacosName(){
        // 输出从Nacos配置中心直接获取的作者名字
        log.info("从Nacos中获取到的作者的姓名为：{}", nacosAuthorName);
        return nacosAuthorName;
    }
}
